package javaCode.chapter13.map_;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @author 徐州城
 * @version 1.0
 */
@SuppressWarnings({"all"})
public class MapSource_ {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("no1", "韩顺平");
        map.put("no2", "张无忌");
        map.put("no1", "xxhh");
        map.put(new Car(),new Person());

        //解读
        //1. k-v 最后存放是 HashMap$Node node = newNode(hash, key, value, null)
        //2. k-v 为了方便程序员的遍历，还会创建 EntrySet集合，该集合存放的元素类型 Entry，而一个Entry
        //   对象就有k,v EntrySet<Entry<k,v>> 即：transient Set<Map.Entry<K,V>> entrySet;
        //3. entrySet 中，定义的类型是 Map.Entry，但实际上存放的还是 HashMap$Node
        //   这是因为 static class Node<k,v> implements Map.Entry<k,v>
        //4. 当把 HashMap$Node 对象 存放到enrySet 就方便我们遍历，因为 Map.Entry 提供了重要方法
        //   K getKey(); V getValue();

        Set set = map.entrySet();
        System.out.println(set.getClass()); //HashMap$EntrySet

        for (Object obj : set) {
            //System.out.println(entry.getClass()); //HashMap$EntrySet
            //为了从 HashMap$Node 取出 k-v
            //1. 先做一个向下转型
            Map.Entry entry1 = (Map.Entry) obj;
            System.out.println(entry1.getKey() + "-" + entry1.getValue());
        }

        Set set1 = map.keySet();
        System.out.println(set1.getClass());
        Collection values = map.values();
        System.out.println(values.getClass());

    }
}

class Car{}

class Person{}
